宽字节注入

题目

/x00

http://ctf.nuptzj.cn/challenges#/x00

view-source:

php if (isset ($_GET['nctf'])) { if (@ereg ("^[1-9]+$", $_GET['nctf']) === FALSE) echo '必须输入数字才行'; else if (strpos ($_GET['nctf'], '#biubiubiu') !== FALSE) die('Flag: '.$flag); else echo '骚年,继续努力吧啊~'; }

解答思路

  • @ereg ("^[1-9]+$", $_GET['nctf'])即要求nctf变量必须是数字,google发现ereg函数存在%00截断漏洞,当遇到%00(NULL)时,函数就截止了。
  • 输入nctf[]= 那为什么ereg()也能符合呢?因为ereg()在出错时返回的也是null,null!==false,所以符合要求

解题步骤

  • 方法1:

使用%00截断,构造payload如nctf=1%00%23biubiubiu,这里#符号需要进行URL编码,输入后的得到flag

  • 方法2:

使用数组的形式绕过,payload为:nctf[]=123,传入之后,ereg是返回NULL的,===判断NULL和FALSE,是不相等的,所以可以进入第二个判断,strpos处理数组时,也是返回NULL,注意这里的是!==,NULL!==FALSE,条件成立,拿到flag

漏洞挖掘思路

  • todo

自动化解析

  • TODO

  • 判断题目特征:web php md5 collision

  • 设定题目难度等级level为simple
  • 提交相应符合要求的字符串